PRELOADER

不念过去 不负现在 不畏将来

当前文章 : 《STM32 DS18B20实验》

12/4/2018 —— 

STM32 DS18B20实验

项目介绍

使用STM32与DS18B20进行连接,并通过串口函数将数据传送到PC机进行显示。

知识点

  • 1、DS18B20是一种单总线的温度传感器。现场温度直接通过单总线以数字方式进行传输。
  • 2、每一个DS18B20均具有一个唯一的64位的ROM序列号,这个唯一的序列号可以保证在单总线上挂载多个DS18B20设备。
  • 3、DS18B20具有9字节的RAM,其中0,1字节用于暂存温度信息,后三位为EERAM用于存储配置信息。
  • 4、DS18B20经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
  • 5、DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位–>SKIP ROM命令( 0XCC)–>发开始转换命令( 0X44) –>延时–>复位–>发送 SKIP ROM 命令( 0XCC)–>发读存储器命令( 0XBE) –>连续读出两个字节数据(即温度)–>结束
  • 6、单总线是DALLAS公司推出的外围串行扩展总线。单总线只用一根数据输出/输入线DQ,既传输数据位,又传输时间同步信号,而且数据是双向的。

部分代码

  • 1、这部分代码为对DS18B20的主要操作。包括了初始化,读写数据。
#include "ds18b20.h"

/*******************************************************************************
* 函 数 名         : ds18b20_init
* 函数功能           : IO端口时钟初始化函数       
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_init()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);

    GPIO_InitStructure.GPIO_Pin=dq;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名         : DQININT
* 函数功能           : 输入配置       
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DQININT()     //输入配置
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin=dq;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名         : DQOUTINT
* 函数功能           : 输出配置       
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DQOUTINT()     //输出配置
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin=dq;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIO_ds18b20,&GPIO_InitStructure);
}

/*******************************************************************************
* 函 数 名         : ds18b20init
* 函数功能           : DS18B20初始化时序       
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20init()
{
    DQOUTINT();//输出
    ds18b20_dq_L;
    delay_us(480);//延时480微妙
    ds18b20_dq_H;
    delay_us(480);//延时480微妙
}

/*******************************************************************************
* 函 数 名         : ds18b20wr
* 函数功能           : DS18B20写数据时序       
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/
void ds18b20wr(u8 dat)
{
    u8 i=0;
    DQOUTINT();//输出

    for(i=0;i<8;i++)
    {
        ds18b20_dq_L;     //拉低
        delay_us(15);//延时15微妙

        if((dat&0x01)==1)
        {
            ds18b20_dq_H;
        }
        else
        {
            ds18b20_dq_L;
        }
        delay_us(60);//延时60微妙
        ds18b20_dq_H;

        dat>>=1;//准备下一位数据的发送
    }
}

/*******************************************************************************
* 函 数 名         : DS18b20rd
* 函数功能           : DS18B20读数据时序       
* 输    入         : 无
* 输    出         : value
*******************************************************************************/
u8 DS18b20rd()
{
    u8 i=0,value=0;

    for(i=0;i<8;i++)
    {
        value>>=1;
        DQOUTINT();//输出
        ds18b20_dq_L;     //拉低
        delay_us(4);//延时4微妙
        ds18b20_dq_H;
        delay_us(10);//延时10微妙
        DQININT();     //输入配置

        if(GPIO_ReadInputDataBit(GPIO_ds18b20,dq)==1)
        {
           value|=0x80;//读数据 从低位开始
        }

        delay_us(45);//延时45微妙
    }

    return value;
}

/*******************************************************************************
* 函 数 名         : readtemp
* 函数功能           : DS18B2温度寄存器配置,温度读取       
* 输    入         : 无
* 输    出         : value
*******************************************************************************/
double readtemp()              //读取温度内需要复位的
{
    u16 temp;
    u8 a,b;
    double value;
    ds18b20init();        //初始化
    ds18b20wr(0xcc);   //发送忽略ROM指令
    ds18b20wr(0x44);   //发送温度转换指令
    delay_ms(800);
    ds18b20init();       //初始化
    ds18b20wr(0xcc);   //发送忽略ROM指令
    ds18b20wr(0xbe);   //发读暂存器指令
    a=DS18b20rd();     //温度的低八位
    b=DS18b20rd();     //温度的高八位
    temp=b;
    temp=(temp<<8)+a;
    if((temp&0xf800)==0xf800)
    {
        temp=(~temp)+1;
        value=temp*(-0.0625);
    }
    else
    {
        value=temp*0.0625;
    }
    return value;
}